package com.summer.filesync.database.dao;

import java.util.List;
import java.util.Optional;

/**
 * 通用数据访问对象接口 提供基本的CRUD操作
 *
 * @param <T> 实体类型
 * @param <ID> 主键类型
 */
public interface BaseDAO<T, ID> {

  /**
   * 保存实体
   *
   * @param entity 要保存的实体
   * @return 保存后的实体
   */
  T save(T entity);

  /**
   * 根据ID查找实体
   *
   * @param id 主键
   * @return Optional包装的实体
   */
  Optional<T> findById(ID id);

  /**
   * 查找所有实体
   *
   * @return 实体列表
   */
  List<T> findAll();

  /**
   * 更新实体
   *
   * @param entity 要更新的实体
   * @return 更新后的实体
   */
  T update(T entity);

  /**
   * 根据ID删除实体
   *
   * @param id 主键
   * @return 是否删除成功
   */
  boolean deleteById(ID id);

  /**
   * 删除实体
   *
   * @param entity 要删除的实体
   * @return 是否删除成功
   */
  boolean delete(T entity);

  /**
   * 统计实体数量
   *
   * @return 实体总数
   */
  long count();

  /**
   * 检查实体是否存在
   *
   * @param id 主键
   * @return 是否存在
   */
  boolean existsById(ID id);
}
